#!/bin/bash

#-----------------------------------------------------------------------
# 一个用于交互式选择、下载并运行指定版本Tomcat Docker容器的脚本。
# 功能:
# 1. 检查 Docker 是否已安装，如果未安装则提供安装指引。
# 2. 自动检查并为Linux系统配置镜像加速器。
# 3. 允许用户从菜单选择Tomcat版本 (7, 8.5, 9, 10)。
# 4. 允许用户自定义容器名称和主机端口。
# 5. 自动在指定目录下创建并挂载数据卷。
# 6. 如果配置目录为空，会自动从镜像中提取默认配置，防止启动失败。
# 7. 仅从镜像源拉取镜像，确保下载速度和稳定性。
# 8. 执行：bash <(curl -sSL https://gitee.com/securitypass/auto-scirpt/raw/master/docker/start_custom_tomcat.sh)


# 设置颜色变量，用于美化输出
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # 无颜色


# 1. --- 安装 Docker (Debian/Ubuntu) ---
install_docker_debian() {
    echo -e "${YELLOW}正在为 Debian/Ubuntu 系统安装 Docker... 这可能需要几分钟。${NC}"
    sudo apt-get update
    sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update
    sudo apt-get install -y docker-ce docker-ce-cli containerd.io
    sudo systemctl start docker
    sudo systemctl enable docker
    echo -e "${GREEN}Docker 安装完成并已启动。${NC}"
    if ! command -v docker &> /dev/null; then
        echo -e "${RED}Docker 安装后仍然找不到命令, 请检查安装过程中的错误。${NC}"
        exit 1
    fi
}

# --- 安装 Docker (CentOS/RHEL/Fedora) ---
install_docker_centos() {
    echo -e "${YELLOW}正在为 CentOS/RHEL/Fedora/openEuler 系统安装 Docker...${NC}"
    if [ -f /etc/os-release ] && grep -qi "openeuler" /etc/os-release; then
        # openEuler 官方推荐安装方式
        sudo dnf install -y docker
        sudo systemctl start docker
        sudo systemctl enable docker
    else
        # 其它 yum/dnf 系统
        sudo yum install -y yum-utils
        sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
        sudo yum install -y docker-ce docker-ce-cli containerd.io
        sudo systemctl start docker
        sudo systemctl enable docker
    fi
    echo -e "${GREEN}Docker 安装完成并已启动。${NC}"
    if ! command -v docker &> /dev/null; then
        echo -e "${RED}Docker 安装后仍然找不到命令, 请检查安装过程中的错误。${NC}"
        exit 1
    fi
}


# --- 自动配置 Docker 镜像加速器 (仅限Linux) ---
configure_docker_mirror() {
    OS="$(uname -s)"
    if [ "${OS}" != "Linux" ]; then
        echo -e "${YELLOW}检测到非Linux系统, 请手动为 Docker Desktop 配置镜像加速器以提高下载速度。${NC}"
        echo "操作路径: Settings -> Docker Engine -> 添加 \"registry-mirrors\": [\"https://1.abclist.eu.org\"]"
        echo "----------------------------------------"
        return
    fi

    DOCKER_CONFIG_FILE="/etc/docker/daemon.json"
    MIRROR_URL="https://1.abclist.eu.org" # 使用一个稳定的公共加速器

    echo "正在检查 Docker 镜像加速器配置..."
    if [ -f "$DOCKER_CONFIG_FILE" ] && grep -q "registry-mirrors" "$DOCKER_CONFIG_FILE"; then
        echo -e "${GREEN}检测到已配置镜像加速器, 无需修改。${NC}"
    else
        echo -e "${YELLOW}未检测到镜像加速器, 准备自动配置...${NC}"
        echo "此操作需要 sudo 权限来修改 '$DOCKER_CONFIG_FILE' 并重启 Docker 服务。"

        # 创建或修改配置文件
        sudo mkdir -p /etc/docker
        sudo bash -c "cat > $DOCKER_CONFIG_FILE" <<EOF
{
  "registry-mirrors": ["$MIRROR_URL"]
}
EOF

        if [ $? -eq 0 ]; then
            echo "配置文件写入成功。"
            echo "正在尝试重启 Docker 服务..."
            sudo systemctl daemon-reload && sudo systemctl restart docker
            if [ $? -eq 0 ]; then
                echo -e "${GREEN}Docker 服务重启成功, 加速器已生效。${NC}"
            else
                echo -e "${RED}Docker 服务重启失败, 请手动执行 'sudo systemctl restart docker'。${NC}"
                exit 1
            fi
        else
            echo -e "${RED}写入配置文件失败, 请检查权限。${NC}"
            exit 1
        fi
    fi
    echo "----------------------------------------"
}


# ---  检查 Docker 环境 ---
check_docker() {
    echo "正在检查 Docker 环境..."
    if ! command -v docker &> /dev/null; then
        echo -e "${RED}错误: 未检测到 Docker 命令。${NC}"
        read -p "是否尝试自动安装 Docker? (y/n): " install_choice
        if [[ "$install_choice" == "y" || "$install_choice" == "Y" ]]; then
            if [ -f /etc/os-release ]; then
                . /etc/os-release
                if [[ "$ID" == "ubuntu" || "$ID" == "debian" ]]; then
                    install_docker_debian
                elif [[ "$ID" == "centos" || "$ID" == "rhel" || "$ID" == "fedora" || "$ID" == "rocky" || "$ID" == "openEuler" ]]; then
                    install_docker_centos
                else
                    if command -v yum &>/dev/null || command -v dnf &>/dev/null; then
                        install_docker_centos
                    else
                        echo -e "${YELLOW}抱歉, 暂不支持您的 Linux 发行版 (${ID}) 的自动安装。${NC}"
                        echo "请参考官方文档手动安装: https://docs.docker.com/engine/install/"
                        exit 1
                    fi
                fi
            else
                echo -e "${YELLOW}无法确定 Linux 发行版, 无法自动安装。${NC}"
                echo "请参考官方文档手动安装: https://docs.docker.com/engine/install/"
                exit 1
            fi
        else
            echo "用户取消安装。脚本退出。"
            exit 1
        fi
    fi

    if ! docker info &> /dev/null; then
        echo -e "${RED}错误: Docker 服务未运行。${NC}"
        echo "请尝试使用 'sudo systemctl start docker' 启动服务后再运行此脚本。"
        exit 1
    fi
    echo -e "${GREEN}Docker 环境正常。${NC}"
    echo "----------------------------------------"
    # 自动配置镜像加速器
    configure_docker_mirror
}



# --- 可配置区域 ---
# 你可以在这里修改所有数据和配置的根目录
# 手动输入数据目录，回车使用默认目录 /opt/tomcat8_app
read -p "请输入Tomcat数据根目录 [默认: /opt/tomcat8_app]: " BASE_DATA_DIR
if [ -z "$BASE_DATA_DIR" ]; then
    BASE_DATA_DIR="/opt/tomcat8_app"
    echo "未输入目录，使用默认: $BASE_DATA_DIR"
else
    echo "已设置数据目录: $BASE_DATA_DIR"
fi
# ------------------




# --- 2. 版本选择 ---
select_version() {
    echo -e "${YELLOW}请选择您想安装的 Tomcat 版本:${NC}"
    echo "1) Tomcat 7 (jdk8)"
    echo "2) Tomcat 8.5 (jdk8)"
    echo "3) Tomcat 9.0 (jdk11)"
    echo "4) Tomcat 10.1 (jdk11)"
    read -p "请输入选项数字 [1-4, 默认: 3]: " version_choice

    # 定义镜像
    ALIYUN_MIRROR="1.abclist.eu.org/library"

    case $version_choice in
        1)
            IMAGE_NAME="tomcat:7.0-jdk8"
            MIRRORED_IMAGE_NAME="${ALIYUN_MIRROR}/tomcat:7.0-jdk8"
            ;;
        2)
            IMAGE_NAME="tomcat:8.5-jdk8"
            MIRRORED_IMAGE_NAME="${ALIYUN_MIRROR}/tomcat:8.5.46-jdk8-openjdk"
            ;;
        4)
            IMAGE_NAME="tomcat:10.1-jdk11"
            MIRRORED_IMAGE_NAME="${ALIYUN_MIRROR}/tomcat:10.1-jdk11"
            ;;
        *)
            IMAGE_NAME="tomcat:9.0-jdk11"
            MIRRORED_IMAGE_NAME="${ALIYUN_MIRROR}/tomcat:9.0.108-jdk8-corretto"
            ;;
    esac

    echo -e "您选择了镜像: ${GREEN}${IMAGE_NAME}${NC}"
    echo "----------------------------------------"
}

# --- 2. 自定义名称和端口 ---
get_user_input() {
    read -p "请输入容器的名称 (例如: my-project-tomcat): " CONTAINER_NAME
    if [ -z "$CONTAINER_NAME" ]; then
        echo -e "${RED}错误: 容器名称不能为空。脚本退出。${NC}"
        exit 1
    fi

    read -p "请输入要映射到主机上的端口 (例如: 8080): " HOST_PORT
    if ! [[ "$HOST_PORT" =~ ^[0-9]+$ ]] || [ "$HOST_PORT" -lt 1 ] || [ "$HOST_PORT" -gt 65535 ]; then
        echo -e "${RED}错误: 无效的端口号。请输入1-65535之间的数字。脚本退出。${NC}"
        exit 1
    fi

    echo "----------------------------------------"
}

# --- 3. 准备本地目录 ---
prepare_directories() {
    WEBAPP_DIR="${BASE_DATA_DIR}/app/webapp"
    LOGS_DIR="${BASE_DATA_DIR}/app/logs"
    CONF_DIR="${BASE_DATA_DIR}/app/conf"

    echo -e "${YELLOW}将在指定目录下创建并挂载以下数据卷:${NC}"
    echo " - 主机路径: ${WEBAPP_DIR} -> 容器路径: /usr/local/tomcat/webapps"
    echo " - 主机路径: ${LOGS_DIR} -> 容器路径: /usr/local/tomcat/logs"
    echo " - 主机路径: ${CONF_DIR} -> 容器路径: /usr/local/tomcat/conf"

    # 创建目录，-p 参数确保即使父目录不存在也能成功创建
    mkdir -p ${WEBAPP_DIR} ${LOGS_DIR} ${CONF_DIR}
    echo "本地目录已准备就绪。"
    echo "----------------------------------------"
}

# --- 4. 启动容器 ---
start_container() {
    echo -e "${YELLOW}准备启动容器...${NC}"

    # 检查同名容器是否已存在，如果存在则停止并删除
    if [ $(docker ps -a -f name=^/${CONTAINER_NAME}$ | grep -w ${CONTAINER_NAME} | wc -l) -gt 0 ]; then
        echo "发现已存在的同名容器 '${CONTAINER_NAME}'，正在停止并删除..."
        docker stop ${CONTAINER_NAME} > /dev/null
        docker rm ${CONTAINER_NAME} > /dev/null
        echo "旧容器 '${CONTAINER_NAME}' 已被删除。"
    fi

    # --- 从镜像源拉取镜像 ---
    echo -e "${YELLOW}正在尝试从镜像源拉取...${NC}"
    echo "正在拉取: ${MIRRORED_IMAGE_NAME}"
    docker pull ${MIRRORED_IMAGE_NAME}

    if [ $? -eq 0 ]; then
        echo -e "${GREEN}镜像拉取成功。${NC}"
        docker tag ${MIRRORED_IMAGE_NAME} ${IMAGE_NAME}
    else
        echo -e "${RED}✘ 镜像源拉取失败! 请检查您的网络连接或镜像地址。${NC}"
        exit 1
    fi
    echo "----------------------------------------"

    # --- [关键优化] 检查并初始化 conf 目录 ---
    CONF_DIR="${BASE_DATA_DIR}/app/conf"
    if [ ! -f "${CONF_DIR}/server.xml" ]; then
        echo -e "${YELLOW}本地 '${CONF_DIR}' 目录为空, 正在从镜像中提取默认配置...${NC}"
        TEMP_CONTAINER_NAME="temp-tomcat-$$"
        docker run -d --name ${TEMP_CONTAINER_NAME} ${IMAGE_NAME} > /dev/null
        sleep 3
        docker cp ${TEMP_CONTAINER_NAME}:/usr/local/tomcat/conf/. ${CONF_DIR}/
        docker stop ${TEMP_CONTAINER_NAME} > /dev/null
        docker rm ${TEMP_CONTAINER_NAME} > /dev/null
        echo -e "${GREEN}默认配置已成功复制到 '${CONF_DIR}'。${NC}"
    else
        echo -e "${GREEN}检测到本地 '${CONF_DIR}' 目录已存在配置, 将直接使用。${NC}"
    fi
    echo "----------------------------------------"


    # 运行容器，并挂载数据卷
    echo "正在以名称 '${CONTAINER_NAME}' 启动容器..."
    docker run -d \
        --name ${CONTAINER_NAME} \
        -p ${HOST_PORT}:8080 \
        -v ${WEBAPP_DIR}:/usr/local/tomcat/webapps \
        -v ${LOGS_DIR}:/usr/local/tomcat/logs \
        -v ${CONF_DIR}:/usr/local/tomcat/conf \
        -e LANG=zh_CN.UTF-8 \
        -e LANGUAGE=zh_CN:zh \
        -e LC_ALL=zh_CN.UTF-8 \
        -w /usr/local/tomcat \
        --restart always \
        ${IMAGE_NAME}

    # 检查容器是否成功运行
    sleep 3
    if [ $(docker ps -f name=^/${CONTAINER_NAME}$ | grep -w ${CONTAINER_NAME} | wc -l) -gt 0 ]; then
        echo -e "${GREEN}✔ 部署成功!${NC}"
        echo -e "  - ${YELLOW}容器名称:${NC} ${CONTAINER_NAME}"
        echo -e "  - ${YELLOW}访问地址:${NC} http://localhost:${HOST_PORT}"
        echo -e "  - ${YELLOW}提示:${NC} 您可以将您的 .war 文件放入 '${WEBAPP_DIR}' 目录中进行自动部署。"
    else
        echo -e "${RED}✘ 部署失败! 请通过 'docker logs ${CONTAINER_NAME}' 查看错误日志。${NC}"
    fi

    echo "----------------------------------------"
}

# --- 主执行流程 ---
main() {
    check_docker
    select_version
    get_user_input
    prepare_directories
    start_container
}

# 调用主函数
main
